home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / smaltalk / manchest.lha / MANCHESTER / manchester / 2.2 / Gnats.st < prev    next >
Text File  |  1993-07-24  |  8KB  |  370 lines

  1. "    NAME        Gnats
  2.     AUTHOR        TPH@cs.man.ac.uk
  3.     FUNCTION flying bugs from LaTeX - simulation/MVC demo 
  4.     ST-VERSIONS    2.2
  5.     PREREQUISITES     
  6.     CONFLICTS    
  7.     DISTRIBUTION      world
  8.     VERSION        1.1
  9.     DATE    22 Jan 1989
  10. SUMMARY    Gnats
  11.     provides a simulation of lots of noxious flying insects found
  12.    in gardens on summer evenings, and which also clutter up the LaTeX
  13.    manual!  A nice little simulation/MVC example.  Known to work only
  14.    with VI2.2 images, but could probably be made to work with earlier
  15.    versions without trouble.(2.2).TPH
  16. "!
  17. 'From Smalltalk-80, Version 2.2 of July 4, 1987 on 11 July 1988 at 2:54:31 pm'!
  18.  
  19.  
  20. MouseMenuController subclass: #GnatController
  21.     instanceVariableNames: ''
  22.     classVariableNames: 'GnatYellowButtonMenu GnatYellowButtonMessages '
  23.     poolDictionaries: ''
  24.     category: 'Simulations-Insects'!
  25. GnatController comment:
  26. 'I represent a controller for interaction with a world full of flying insects.
  27. I support a yellow button menu which allows new Gnats to be added
  28. to the world, or an (arbitrary) Gnat removed.  I also permit the form,
  29. used by the View to display the Gnats, to be edited.'!
  30.  
  31.  
  32. !GnatController methodsFor: 'initialize-release'!
  33.  
  34. initialize
  35.     "Initialize the yellow button menu."
  36.  
  37.     super initialize.
  38.     self
  39.         yellowButtonMenu: GnatYellowButtonMenu
  40.         yellowButtonMessages: GnatYellowButtonMessages! !
  41.  
  42. !GnatController methodsFor: 'menu messages'!
  43.  
  44. addGnat
  45.     "Add a Gnat to the model."
  46.  
  47.     model add: Gnat new!
  48.  
  49. editForm
  50.     "Edit the form used to display the Gnat."
  51.  
  52.     BitEditor openOnForm: view form scale: 32@32!
  53.  
  54. removeGnat
  55.     "Remove an (arbitrary) Gnat from the model."
  56.  
  57.     model remove! !
  58.  
  59. !GnatController methodsFor: 'control defaults'!
  60.  
  61. controlActivity
  62.     "Modify the model."
  63.  
  64.     self model move.
  65.     super controlActivity!
  66.  
  67. isControlActive
  68.     ^(view containsPoint: sensor cursorPoint) & sensor blueButtonPressed not! !
  69. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  70.  
  71. GnatController class
  72.     instanceVariableNames: ''!
  73.  
  74.  
  75. !GnatController class methodsFor: 'class initialization'!
  76.  
  77. initialize
  78.     "GnatController initialize."
  79.  
  80.     GnatYellowButtonMenu _ PopUpMenu
  81.         labels: 'add gnat\remove gnat\edit gnat image' withCRs
  82.         lines: #(2).
  83.     GnatYellowButtonMessages _ #(addGnat removeGnat editForm).! !
  84.  
  85. GnatController initialize!
  86.  
  87.  
  88.  
  89. !BitEditor class methodsFor: 'instance creation'!
  90.  
  91. openOnForm: aForm scale: scaleFactor
  92.     ^ self openOnForm: aForm
  93.         at: (self locateMagnifiedView: aForm scale: scaleFactor) topLeft
  94.         scale: scaleFactor! !
  95.  
  96. View subclass: #GnatView
  97.     instanceVariableNames: 'gnatform '
  98.     classVariableNames: ''
  99.     poolDictionaries: ''
  100.     category: 'Simulations-Insects'!
  101. GnatView comment:
  102. 'I represent a View on a world full of flying insects.  I keep a form
  103. which is used to display each gnat.'!
  104.  
  105.  
  106. !GnatView methodsFor: 'initialize-release'!
  107.  
  108. initialize
  109.     "Initialize the receiver.  Create a suitable form for display purposes."
  110.  
  111.     super initialize.
  112.     gnatform _ (Form
  113.     extent: 8@8
  114.     fromCompactArray: #('B'
  115. 'Ñ'
  116. 'Z'
  117. '<'
  118. ''
  119. ''
  120. '$'
  121. '$'
  122. )
  123.     offset: 0@0)! !
  124.  
  125. !GnatView methodsFor: 'accessing'!
  126.  
  127. form
  128.     "Answer with the form used to display the Gnats."
  129.  
  130.     ^gnatform! !
  131.  
  132. !GnatView methodsFor: 'displaying'!
  133.  
  134. displayView
  135.     "Re-display the entire model."
  136.  
  137.     model asPoints do: [ :eachPoint |
  138.         gnatform
  139.             displayOn: Display
  140.             at: (self displayTransform: eachPoint)
  141.             clippingBox: self insetDisplayBox
  142.             rule: Form paint
  143.             mask: Form black]! !
  144.  
  145. !GnatView methodsFor: 'controller access'!
  146.  
  147. defaultControllerClass
  148.     ^GnatController! !
  149.  
  150. !GnatView methodsFor: 'updating'!
  151.  
  152. update: aParameter
  153.     "Ignore aParameter, and update the view."
  154.  
  155.     self display! !
  156. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  157.  
  158. GnatView class
  159.     instanceVariableNames: ''!
  160.  
  161.  
  162. !GnatView class methodsFor: 'instance creation'!
  163.  
  164. open
  165.     "Open a view on an empty GnatWorld."
  166.     "GnatView open."
  167.  
  168.     self openOn: GnatWorld new!
  169.  
  170. openOn: aGnatWorld
  171.     "GnatView openOn: (GnatWorld new: 10)."
  172.  
  173.     | topView gnatView |
  174.     topView _ StandardSystemView
  175.                     model: nil
  176.                     label: aGnatWorld class printString
  177.                     minimumSize: 300@300.
  178.     gnatView _ self new borderWidth: 1.
  179.     gnatView model: aGnatWorld.
  180.     gnatView window: (0@0 corner: 1000@1000).
  181.     gnatView insideColor: Form white.
  182.     topView addSubView: gnatView.
  183.     topView controller open! !
  184.  
  185. Model subclass: #GnatWorld
  186.     instanceVariableNames: 'gnats '
  187.     classVariableNames: ''
  188.     poolDictionaries: ''
  189.     category: 'Simulations-Insects'!
  190. GnatWorld comment:
  191. 'I represent a world full of flying insects.  I keep an OrderedCollection
  192. of insects.  Gnats can be added or removed.'!
  193.  
  194.  
  195. !GnatWorld methodsFor: 'initialize-release'!
  196.  
  197. initialize
  198.  
  199.     gnats _ OrderedCollection new.! !
  200.  
  201. !GnatWorld methodsFor: 'accessing'!
  202.  
  203. add: aGnat
  204.     "insert aGnat into the world."
  205.  
  206.     gnats add: aGnat!
  207.  
  208. asPoints
  209.     "Answer with an OrderedCollection of (2D) points representing the
  210.      receiver."
  211.  
  212.     ^gnats collect: [ :eachGnat | eachGnat asPoint]!
  213.  
  214. remove
  215.     "Remove an arbitrary Gnat from the world."
  216.  
  217.     gnats isEmpty ifFalse: [gnats removeLast]! !
  218.  
  219. !GnatWorld methodsFor: 'moving'!
  220.  
  221. move
  222.     "Move all the Gnats in the world."
  223.  
  224.     gnats do: [ :eachGnat | eachGnat move.  eachGnat change].
  225.     self changed! !
  226. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  227.  
  228. GnatWorld class
  229.     instanceVariableNames: ''!
  230.  
  231.  
  232. !GnatWorld class methodsFor: 'instance creation'!
  233.  
  234. new
  235.     "Create a new instance of the receiver."
  236.  
  237.     ^super new initialize!
  238.  
  239. new: aNumber
  240.     "Create a new instance of the receiver, containing aNumber gnats."
  241.  
  242.     | newWorld |
  243.     newWorld _ self new.
  244.     aNumber timesRepeat: [newWorld add: Gnat new].
  245.     ^newWorld! !
  246.  
  247. Model subclass: #Gnat
  248.     instanceVariableNames: 'x y z dx dy dz '
  249.     classVariableNames: 'MaxDX MaxDY MaxDZ MaxX MaxY MaxZ RandomGenerator '
  250.     poolDictionaries: ''
  251.     category: 'Simulations-Insects'!
  252. Gnat comment:
  253. 'I represent a class of noxious flying insects, often found in gardens during
  254. summer evenings, and also in LaTeX manuals.
  255.  
  256. I keep a known location in 3-space, using x, y and z instance variables,
  257. together with a current velocity (dx, dy, dz).  Occasionally, I change my
  258. velocity extensively.'!
  259.  
  260.  
  261. !Gnat methodsFor: 'initialize-release'!
  262.  
  263. initialize
  264.     "Initialize the receiver."
  265.  
  266.     x _ (RandomGenerator next * MaxX) truncated.
  267.     y _ (RandomGenerator next * MaxY) truncated.
  268.     z _ (RandomGenerator next * MaxZ) truncated.
  269.     dx _ (RandomGenerator next * MaxDX * 2) truncated - MaxDX.
  270.     dy _ (RandomGenerator next * MaxDY * 2) truncated - MaxDY.
  271.     dz _ (RandomGenerator next * MaxDZ * 2) truncated - MaxDZ.! !
  272.  
  273. !Gnat methodsFor: 'accessing'!
  274.  
  275. asPoint
  276.     "Answer with a 2D point representing the x and y coordinates
  277.      of the receiver."
  278.  
  279.     ^x@y!
  280.  
  281. dx: aNumber
  282.     "Set the x speed of the receiver."
  283.  
  284.     dx _ aNumber!
  285.  
  286. dy: aNumber
  287.     "Set the y speed of the receiver."
  288.  
  289.     dy _ aNumber!
  290.  
  291. dz: aNumber
  292.     "Set the z speed of the receiver."
  293.  
  294.     dz _ aNumber!
  295.  
  296. x: aNumber
  297.     "Set the x coordinate of receiver."
  298.  
  299.     x _ aNumber!
  300.  
  301. y: aNumber
  302.     "Set the y coordinate of receiver."
  303.  
  304.     y _ aNumber!
  305.  
  306. z: aNumber
  307.     "Set the z coordinate of receiver."
  308.  
  309.     z _ aNumber! !
  310.  
  311. !Gnat methodsFor: 'moving'!
  312.  
  313. change
  314.     "Only change speed and direction with low probability."
  315.  
  316.     (RandomGenerator next > 0.9) ifTrue: [self changeDirection].!
  317.  
  318. changeDirection
  319.     "Change the current deltas."
  320.  
  321.     dx _ (RandomGenerator next * 2 * MaxDX) truncated - MaxDX.
  322.     dy _ (RandomGenerator next * 2 * MaxDY) truncated - MaxDY.
  323.     dz _ (RandomGenerator next * 2 * MaxDZ) truncated - MaxDZ.!
  324.  
  325. move
  326.     "Move the receiver to a new location as given by the current
  327.      deltas.  Simulate a closed universe."
  328.  
  329.     x _ x + dx \\ MaxX.
  330.     y _ y + dy \\ MaxY.
  331.     z _ z + dz \\ MaxZ.! !
  332.  
  333. !Gnat methodsFor: 'printing'!
  334.  
  335. printOn: aStream
  336.  
  337.     aStream nextPutAll: self class printString, ' at ('.
  338.     x printOn: aStream.
  339.     aStream nextPut: Character space.
  340.     y printOn: aStream.
  341.     aStream nextPut: Character space.
  342.     z printOn: aStream.
  343.     aStream nextPut: $).! !
  344. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  345.  
  346. Gnat class
  347.     instanceVariableNames: ''!
  348.  
  349.  
  350. !Gnat class methodsFor: 'instance creation'!
  351.  
  352. new
  353.     "Create a new initialized instance of the receiver."
  354.  
  355.     ^super new initialize! !
  356.  
  357. !Gnat class methodsFor: 'class initialization'!
  358.  
  359. initialize
  360.     "Gnat initialize."
  361.  
  362.     MaxX _ MaxY _ MaxZ _ 1000.
  363.     MaxDX _ MaxDY _ MaxDZ _ 50.
  364.     RandomGenerator _ Random new.! !
  365.  
  366. Gnat initialize!
  367.  
  368.  
  369.  
  370.